/**
 * @file      config_data.h
 * @brief
 * @version   1.0
 * @date      2023.12.14
 *
 * @copyright Copyright (c) 2018 UCchip Technology Co.,Ltd. All rights reserved.
 *
 * Change Logs:
 * Date          Author       Notes
 * 2023.12.14    mxzou        the first version
 *
 */

#ifndef __CONFIG_DATA_H__
#define __CONFIG_DATA_H__

#include "cJSON.h"

#define JSON_DATA_CRC32 "data_crc32"
#define JSON_DATA_LEN "data_len"
#define JSON_DATA "data"

#define DATA_HEAD_SIZE (2)

//{ 以下为json关键字定义
#define WIOTA_VERSION "wiota_ver"
#define GIT_INFO "git"
#define MAKE_TIME "mk_time"
#define CCE_VERSION "cce"

#define WIOTA_CFG "wiota"

#define WIOTA_SYS_CFG "sys"
#define SYMBOL_LENGTH "sym_len"
#define DLUL_RATIO "dur"
#define GROUP_NUMBER "group"
#define BT_VALUE "bt"
#define SUBSYSTEM_ID "ssid"

#define WIOTA_ACT_CFG "act"
#define ACTIVE_TIME "time"

#define WIOTA_FREQ_CFG "freq"
#define FREQ_LIST "freq_list"
#define CURRENT_FREQ "cur_freq"

#define WIOTA_POWER_CFG "power"
#define POWER_VALUE "val"

#define WIOTA_RATE_CFG "rate"
#define UNICAST_MCS "ucmcs"
#define MID_MODE_STATE "mid_mode"
#define HIGH_MODE_STATE "high_mode"
#define BROADCAST_MCS "bcmcs"
#define CCE_CRC_TYPE "crc_type"
#define BC_SEND_ROUND "bc_round"
#define UC_RESEND_TIMES "uc_resend"

#define WIOTA_PAGING_TX_CFG "paging"
#define PAGING_TX_FREQ "freq"
#define AWAKEN_ID "awaken_id"
#define SEND_TIME "send_time"
#define PAGING_TX_MODE "tx_mode"

#define WIOTA_SYNC_PAGING_CFG "sync_paging"
#define DEV_ID "dev_id"
#define PERIOD "prd"
#define REAL_PERIOD "real_prd"
#define SEND_ROUND "round"
#define FRAME_NUM "fn"

#define WIOTA_TS_CFG "ts"
#define TS_MODE "mode"
#define DEV_TYPE "type"
#define TS_PERIOD "ts_prd"

#define WIOTA_SUBF_MODE_CFG "subf"
#define WIOTA_SUBF_MODE "mode"
#define WIOTA_SUBF_BLOCK_SIZE "block_size"
#define WIOTA_SUBF_TOTAL_SIZE "total_size"

#define GW_CFG "gw"

#define GW_BASE_CFG "base"
#define COMPANY "cmp"
#define DEV_SERIAL "serial"
#define HARDWARE_VERSION "hw_ver"
#define SOFTWARE_VERSION "sw_ver"

#define GW_AUTH_CFG "auth"
#define WORK_MODE "w_mode"
#define GW_VERITY "gw_verity"
#define KEY_TYPE "key_type"
#define KEY "key"

#define GW_ID_MNG_CFG "id_mng"
#define ASSIGN_START_ADDR "start"
#define ASSIGN_END_ADDR "end"
#define ADDR_NUM "num"

#define GW_NET_CFG "net_all"
#define NETDEV_POLICY "policy"
#define NETDEV_NAME "name"
#define NET_INTERFACE "net_if"
#define NET_DEV_STATE "state"
#define STATIC_IP "static_ip"
#define MAC_ADDR "mac"
#define IP_ADDR "ip"
#define GATEWAY_ADDR "gw"
#define MASK_ADDR "mask"
#define PRIMARY_DNS "p_dns"
#define SECONDARY_DNS "s_dns"
#define MASK_ADDR "mask"
#define GW_WIFI_CFG "wifi"
#define GW_CAT1_CFG "cat1"
#define CAT1_CSQ "csq"
#define CAT1_CCID "ccid"
#define CAT1_CIMI "cimi"
#define CAT1_GSN "gsn"
#define CAT1_APN "apn"

#define GW_BT_CFG "bt"

#define GW_MQTT_CFG "mqtt"
#define URL "url"
#define MQTT_PORT "port"
#define CLIENT_ID "client"
#define USERNAME "user"
#define PASSWORD_DISPLAY_LEN (8)
#define PASSWORD "pwd"
#define MQTT_QOS "qos"

#define GW_DATA_CFG "data_cfg"
#define UP_ENCODE "up_encode"
#define UL_DATA_FLOW "ul_flow"
#define UL_DATA_PRINT "ul_print"
#define DL_DATA_PRINT "dl_print"

#define GW_WTD_CFG "wtd"
#define WTD_STATE "state"

#define FTP_LOG "ftp_log"
#define FTP_PORT "port"
#define SERVER_PATH "path"

#define GW_LOG_SWITCH_CFG "log_switch"
#define GW_LOG_UART "uart"
#define GW_AP_LOG_OUTPUT "ap_log"

#define GW_UART_485_CFG "uart_485"
#define GW_UART_485_BAUD "baud"

#define GW_TIMED_CFG "timed_cfg"
#define GW_TIME "time"
#define GW_UNABNORMAL_TIME "mqtt_timeout"
#define GW_ROLL_CALL_TIME "rc_time"
#define GW_ROLL_CALL_RTO "rc_rto"

#define GW_RESET_FACTORY "reset"
#define GW_REBOOT "reboot"
#define YMODEM_DOWNLOAD "ymodem"

#define GW_ALL_CFG "all"

#define SYNC_ASSISTANT_CFG "sync"
#define BAND_WIDTH "bw"

#define SLOT_SEND_CFG "slot"
#define UL_MAX_LEN "ul_len"
#define DL_MAX_LEN "dl_len"
#define UL_RESEND_TIMES "ul_resend_times"
#define DL_RESEND_TIMES "dl_resend_times"
#define BC_FN_SEND_PERIOD "bc_fn_prd"
#define ALIVE_FUNCTION "alive"
#define UL_MCS "ul_mcs"
#define DL_MCS "dl_mcs"
#define DEVICE_ACCESS_MAX "dev_max"

#define SYNC_DEF_FLAG "def_flag"
#define SYNC_WORK_MODE "sy_mode"
#define SYNC_SYMBOL_LENGTH "sy_sym_len"
#define SYNC_BAND_WIDTH "sy_bw"
#define SYNC_MCS "sy_mcs"
#define SYNC_FREQ "sy_freq"
#define SYNC_POWER "sy_pow"
#define SYNC_CYCLE "sy_cycle"
#define SYNC_WIOTA_LOG "sy_wlog"
#define SYNC_WDT "sy_wdt"
#define SYNC_WHITELIST "sy_wl"
#define SYNC_DYNAMICS_INFO "sy_info"

#define IMMEDIATE_EFFECTIVE_CFG "ie_cfg"
#define FACTORY_TEST_RESULT "ft_res"

#define GW_AUTH_LIST "auth_list"
#define GW_SCAN_FREQ_STOP "scan_stop"

//} json关键字定义结束

#define MAX_WHITELIST_NUM (10)

/**
 * @brief WIoTa版本信息结构体
 *
 */
typedef struct wiota_version
{
    char uc8088_version[36];  /**< WIoTa版本号 */
    char git_info_8088[36];   /**< WIoTa版本tag信息 */
    char make_time_8088[36];  /**< WIoTa构建时间 */
    unsigned int cce_version; /**< WIoTa基带版本 */
} wiota_version_t;

/**
 * @brief WIoTa子网配置信息结构体
 *
 */
typedef struct
{
    unsigned char symbol_length; /**< 帧配置，取值0，1，2，3代表128，256，512，1024 */
    unsigned char dlul_ratio;    /**< 帧配置，该值代表一帧里面上下行group的比例，取值0，1代表1:1和1:2 */
    unsigned char group_number;  /**< 帧配置，取值0，1，2，3分别代表一帧里包含1，2，4，8个上行group数量 */
    unsigned char bt_value;      /**< 该值和调制信号的滤波器带宽对应，值越大，信号带宽越大，取值0，1代表BT配置为1.2和BT配置为0.3 */
    unsigned int subsystem_id;   /**< 子系统id（子系统的识别码，终端IOTE如果要连接该子系统（AP），需要将config配置里的子系统ID参数配置成该ID）*/
} wiota_sys_cfg_t;

/**
 * @brief WIoTa连接态时间配置结构体
 *
 */
typedef struct
{
    unsigned int active_time; /**< WIoTa连接态超时时间 */
} wiota_act_cfg_t;

/**
 * @brief WIoTa频点列表信息结构体
 *
 */
typedef struct
{
    unsigned char freq_list[16]; /**< WIoTa频点列表 */
    unsigned char current_freq;  /**< WIoTa当前频点，只读 */
    unsigned char na[3];         /**< 对齐预留位 */
} wiota_freq_cfg_t;

/**
 * @brief WIoTa发射功率配置信息结构体
 *
 */
typedef struct
{
    unsigned char power; /**< WIoTa发射功率 */
    unsigned char na[3]; /**< 对齐预留位 */
} wiota_power_cfg_t;

/**
 * @brief WIoTa速率模式配置结构体
 *
 */
typedef struct
{
    unsigned char unicast_mcs;      /**< 单播MCS */
    unsigned char mid_mode_state;   /**< 中速模式状态 */
    unsigned short high_mode_state; /**< 高速模式状态 */
    unsigned char broadcast_mcs;    /**< 广播MCS */
    unsigned char crc_type;         /**< 基带CRC类型，默认为0表示crc32，1表示crc8，为1时高阶mcs单帧可多携带3字节数据，语音数据传输开启，其他模式不建议开启 */
    unsigned char bc_send_round;    /**< 广播发送轮数，默认发送三轮，控制对普通广播，OTA广播和组播有效 */
    unsigned char uc_resend_times;  /**< 下行单播重发次数，默认为0，表示不重发 */
} wiota_rate_cfg_t;

/**
 * @brief WIoTa连续信号唤醒配置信息结构体，参数含义见uc_lpm_tx_cfg_t
 *
 */
typedef struct
{
    unsigned char freq;
    // unsigned char spectrum_idx; // 暂时不支持
    // unsigned char bandwidth;    // 暂时不支持
    unsigned char symbol_length;
    unsigned short awaken_id;
    unsigned int send_time;
    unsigned int mode;
} wiota_paging_tx_cfg_t;

/**
 * @brief WIoTa周期信号唤醒配置信息结构体，参数含义见uc_paging_info_t
 *
 */
typedef struct
{
    unsigned int dev_id;
    // unsigned int fn_index; // 只读参数，用户不用设置
    unsigned int detection_period;
    unsigned int send_round;
    unsigned int continue_fn;
} wiota_sync_paging_cfg_t;

/**
 * @brief WIoTa授时配置结构体
 *
 */
typedef struct
{
    unsigned char ts_mode;   /**< WIoTa授时模式，见uc_ts_mode_e */
    unsigned char dev_type;  /**< ts_mode为2时有效，见uc_1588_dev_e */
    unsigned char ts_period; /**< 授时周期，默认15分钟，范围5~60分钟 */
    unsigned char na;        /**< 对齐预留位 */
} wiota_ts_cfg_t;

/**
 * @brief WIoTa子帧连续接收模式结构体，语音数据专用模式
 *
 */
typedef struct
{
    unsigned char ul_subf_mode;       /**< 上行子帧模式开关，0表示关闭，1表示一帧只有一包上行数据，2表示一帧有2包上行数据 */
    unsigned char block_size;         /**< 子帧数据块大小(即语音数据单帧数据量)，单位字节，默认12字节 */
    unsigned char dl_subf_send_round; /**< 下行子帧数据发送轮数，默认一轮，最多三轮 */
    unsigned char na;                 /**< 对齐预留位 */
} wiota_subf_mode_cfg_t;

/**
 * @brief WIoTa配置信息结构体
 *
 */
typedef struct
{
    wiota_sys_cfg_t sys_cfg;
    wiota_act_cfg_t act_cfg;
    wiota_freq_cfg_t freq_cfg;
    wiota_power_cfg_t power_cfg;
    wiota_rate_cfg_t rate_cfg;
    wiota_paging_tx_cfg_t paging_tx_cfg;
    wiota_sync_paging_cfg_t sync_paging_cfg;
    wiota_ts_cfg_t ts_cfg;
    wiota_subf_mode_cfg_t subf_cfg;
} wiota_cfg_t;

/**
 * @brief 网关基础信息配置结构体
 *
 */
typedef struct
{
    char company[16];             /**< 公司名称 */
    unsigned char dev_serial[16]; /**< 网关设备串号 */
    // 设备ID不支持恢复出厂模式，不建议随意修改。
    unsigned int dev_id;       /**< 网关设备ID，保证唯一 */
    char hardware_version[16]; /**< 网关硬件版本 */
    char software_version[16]; /**< 网关软件版本 */
} gw_base_cfg_t;

/**
 * @brief 网关ID管理地址配置结构体
 *
 */
typedef struct
{
    unsigned int assign_start_addr; /**< 分配起始地址 */
    unsigned int assign_end_addr;   /**< 分配结束地址 */
    unsigned int addr_num;          /**< 平铺的ID个数 */
} gw_id_manager_cfg_t;

/**
 * @brief 网关鉴权信息配置结构体
 *
 */
typedef struct
{
    unsigned char work_mode; /**< 网关工作模式，见uc_work_mode_e */
    unsigned char gw_verity; /**< 是否开启网关验证标志，此标志状态需要和终端一致(at+gatewayverity)，开启后会在鉴权响应中携带网关ID，终端收到响应后保存该网关ID。
                                  1) 网关发送数据会在网关头的src_addr填充为自己的ID，终端收到数据会验证网关ID；
                                  2) 终端发送数据会携带网关ID，网关收到数据会验证网关头的dest_addr是否为自己的ID */
    unsigned short key_type; /** 鉴权码类型，见uc_key_type_e */
    char key[16];
} gw_auth_cfg_t;

/**
 * @brief 网络策略配置信息结构体
 *
 */
typedef struct
{
    unsigned int netdev_policy; /**< 当前网卡策略，自动选择或手动，见uc_netdev_policy_e */
    char netdev_name[4];        /**< 网口设备名称，如：e0、w0、pp，且netdev_policy为1时有效 */
} gw_net_policy_cfg_t;

/**
 * @brief 网口配置信息结构体
 *
 */
typedef struct
{
    char netdev_state[16];    /**< 网口设备名称 + 状态，只读，如：e0 (Default) */
    unsigned short static_ip; /**< 静态IP标识，0表示动态IP，1表示静态IP */
    unsigned char mac[6];     /**< mac地址，保证唯一 */
    char ip_addr[16];         /**< ip地址 */
    char gateway_addr[16];    /**< 网关地址 */
    char mask_addr[16];       /**< mask地址 */
    char primary_dns[16];     /**< 主DNS服务器地址 */
    char secondary_dns[16];   /**< 备用DNS服务器地址 */
} gw_net_if_cfg_t;

/**
 * @brief WIFI配置信息结构体
 *
 */
typedef struct
{
    char netdev_state[16];    /**< 网口设备名称 + 状态，只读，如：e0 (Default) */
    unsigned short static_ip; /**< 静态IP标识，0表示动态IP，1表示静态IP */
    unsigned char mac[6];     /**< mac地址，只读 */
    char ip_addr[16];         /**< ip地址 */
    char gateway_addr[16];    /**< 网关地址 */
    char mask_addr[16];       /**< mask地址 */
    char primary_dns[16];     /**< 主DNS服务器地址 */
    char secondary_dns[16];   /**< 备用DNS服务器地址 */
    char username[32];        /**< 登录WIFI所需的用户名 */
    char password[32];        /**< 登录WIFI所需的密码 */
} gw_wifi_cfg_t;

/**
 * @brief CAT1配置信息结构体，cat1配置为只读，不支持修改
 *
 */
typedef struct
{
    char netdev_state[16]; /**< 网口设备名称 + 状态，只读，如：e0 (Default) */
    unsigned char mac[6];  /**< mac地址 */
    char ip_addr[16];      /**< ip地址 */
    char gateway_addr[16]; /**< 网关地址 */
    char mask_addr[16];    /**< mask地址 */
    char csq[4];           /**< 信号强度 */
    char ccid[32];         /**< SIM 卡的集成电路卡识别码 */
    char cimi[32];         /**< SIM卡的国际移动用户识别码（IMSI） */
    char gsn[32];          /**< 国际移动设备识别码（IMEI 号） */
    char apn[32];          /**< 接入点名称 */
} gw_cat1_cfg_t;

/**
 * @brief 网关网络配置
 *
 */
typedef struct
{
    gw_net_policy_cfg_t net_policy_cfg;
    gw_net_if_cfg_t net_if_cfg;
    gw_wifi_cfg_t wifi_cfg;
    gw_cat1_cfg_t cat1_cfg;
} gw_net_cfg_t;

/**
 * @brief 蓝牙配置结构体
 *
 */
typedef struct
{
    char mac[16]; /**< mac地址，只读, mac地址为12字节，剩余字节用0填充 */
} gw_bt_cfg_t;

/**
 * @brief MQTT服务器配置结构体
 *
 */
typedef struct
{
    char url[32];       /**< MQTT服务器地址 */
    unsigned int port;  /**< MQTT服务器端口号 */
    char client_id[32]; /**< MQTT客户端ID，保证唯一.有效值最大长度23字节 */
    char username[32];  /**< 登录MQTT服务器的用户名，可为空 */
    char password[32];  /**< 登录MQTT服务器的密码，可为空 */
    unsigned int qos;   /**< MQTT QOS能力等级 */
} gw_mqtt_server_cfg_t;

/**
 * @brief 网关上下行数据配置结构体
 *
 */
typedef struct
{
    unsigned char up_encode;     /**< 上行数据编码配置 */
    unsigned char ul_data_flow;  /**< 终端上行数据流向, uc_up_data_flow_e， 0：到网络，1：到串口工具，2：到蓝牙 */
    unsigned char ul_data_print; /**< 上行数据打印开关，0：关闭，1：打印上行数据，默认关闭，调试用 */
    unsigned char dl_data_print; /**< 下行数据打印开关，0：关闭，1：打印下行数据，默认关闭，调试用 */
} gw_data_cfg_t;

/**
 * @brief 看门狗配置结构体
 *
 */
typedef struct
{
    unsigned char wtd_state; /**< 看门狗状态 */
} gw_wtd_cfg_t;

/**
 * @brief ftp log配置结构体
 *
 */
typedef struct
{
    unsigned char ftp_log; /**< 网关ftp LOG状态 */
    unsigned char na;      /**< 对齐预留位 */
    unsigned short port;   /**< ftp服务器端口号 */
    char ip_addr[64];      /**< ftp服务器ip地址 */
    char username[32];     /**< ftp服务器用户名 */
    char password[32];     /**< ftp服务器密码 */
    char server_path[64];  /**< ftp服务器存放LOG文件路径 */
} gw_ftp_log_cfg_t;

/**
 * @brief 网关log口切换配置结构体
 *
 */
typedef struct
{
    char log_uart[8];
    unsigned char ap_log_output; /**< 串口AP输出log开关，0：关闭，1：开启 */
    unsigned char na[3];         /**< 对齐预留位 */
} gw_log_switch_cfg_t;

/**
 * @brief  UART 485配置结构体
 *
 */
typedef struct
{
    unsigned int baud_rate;
} gw_uart_485_cfg_t;

/**
 * @brief 网关定时配置结构体
 *
 */
typedef struct
{
    unsigned int time;           /**< 定时重启时间，0-23代表重启时间(24小时制整点)，大于23关闭定时重启功能 */
    unsigned int abnormal_time;  /**< mqtt连续异常重启时间，默认值为五分钟 */
    unsigned int roll_call_time; /**< 网关定时点名时间，默认为0，表示关闭，单位：分钟 */
    unsigned int rc_rto;         /**< roll_call real time online，通过定时点名来判断终端是否实时在线的功能，默认关闭，roll_call_time不为0时有效，开启此功能后
                                      如过点名空包发送失败，则认为该终端离线，网关会将该终端从信任列表中移除 */
} gw_timed_cfg_t;

/**
 * @brief 网关配置信息结构体
 *
 */
typedef struct
{
    gw_base_cfg_t base_cfg;
    gw_auth_cfg_t auth_cfg;
    gw_id_manager_cfg_t id_mng_cfg;
    gw_net_policy_cfg_t net_policy_cfg;
    gw_net_if_cfg_t net_if_cfg;
    gw_wifi_cfg_t wifi_cfg;
    gw_cat1_cfg_t cat1_cfg;
    gw_bt_cfg_t bt_cfg;
    gw_mqtt_server_cfg_t mqtt_server_cfg;
    gw_data_cfg_t data_cfg;
    gw_wtd_cfg_t wtd_cfg;
    gw_ftp_log_cfg_t log_cfg;
    gw_log_switch_cfg_t log_switch_cfg;
    gw_uart_485_cfg_t uart_485_cfg;
    gw_timed_cfg_t timed_cfg;
} gateway_cfg_t;

/**
 * @brief 同步助手配置
 *
 */
typedef struct
{
    unsigned char user_def_flag;
    // 工作模式. 0 为正常的工作模式， 1为 测试模式
    unsigned char mode;
    // 默认 1024
    unsigned char symbol_len;
    // 默认 50k
    unsigned char bt;
    // 默认mcs0
    unsigned char mcs;
    // 默认22dbm
    unsigned char power;
    // 默认工作频点为 1
    unsigned short freq;
    // 默认打开wiota 的log
    unsigned char wiota_log;
    unsigned char na[3]; // 保留字段
    // 同步周期，单位时ms,默认值 60s.
    unsigned int sync_cycle;
    // watchdog 开关
    unsigned char watchdog_flag;
    unsigned char na1[3]; // 保留字段
    // 白名单，最大支持10个
    unsigned short whitelist[MAX_WHITELIST_NUM];
} sync_cfg_t;

/**
 * @brief 分时发送配置结构体
 *
 */
typedef struct
{
    unsigned int alive_timeout;              /**< 保活超时时间，0：关闭，大于1：开启。开启此功能后，在ID资源不够时，有新的终端接入，将遍历信任列表，查询保活时间是否超时，若有
                                              超时终端（超时是指在超过alive_timeout没收到任何数据），则会直接将该超时终端剔除，以让出资源给新终端，单位：毫秒 */
    unsigned int data_transport_period;      /**< 数据收发周期 */
    unsigned short ul_max_len;               /**< 上行数据的最大长度 */
    unsigned short dl_max_len;               /**< 下行数据的最大长度 */
    unsigned char ul_resend_times;           /**< 上行数据的重发次数 */
    unsigned char dl_resend_times;           /**< 下行数据的重发次数 */
    unsigned char ul_mcs;                    /**< 上行数据的MCS */
    unsigned char dl_mcs;                    /**< 下行数据的MCS */
    unsigned short bc_frame_send_period;     /**< WIoTa广播帧发送周期 */
    unsigned short device_access_max;        /**< 设备接入最大数量 */
    unsigned int real_data_transport_period; /**< 实际上行数据的发送周期 */
} slot_send_cfg_t;

/**
 * @brief 网关静态数据配置信息结构体
 *
 */
typedef struct
{
    wiota_cfg_t wiota_cfg;
    gateway_cfg_t gateway_cfg;
    sync_cfg_t sync_cfg;
    slot_send_cfg_t slot_send_cfg;
} static_data_t;

/**
 * @brief 网关静态数据信息结构体
 *
 */
typedef struct
{
    char data_head[DATA_HEAD_SIZE]; /**< 静态数据头 */
    short version;                  /**< 静态数据版本号 */
    unsigned int total_size;        /**< 静态数据总大小 */
    unsigned int used_size;         /**< 静态数据使用大小 */
    unsigned int readonly_size;     /**< 静态数据只读大小 */
    unsigned int crc32_value;       /**< 静态数据CRC32校验值 */
    static_data_t static_data;      /**< 网关静态数据配置信息 */
} backup_data_t;

//{parse begin
int parse_gateway_base_cfg(const cJSON *data_json, gw_base_cfg_t *base_cfg);
int parse_gateway_auth_cfg(const cJSON *data_json, gw_auth_cfg_t *auth_cfg);
int parse_gateway_id_mng_cfg(const cJSON *data_json, gw_id_manager_cfg_t *id_mng_cfg);
int parse_gateway_net_policy_cfg(const cJSON *data_json, gw_net_policy_cfg_t *net_policy_cfg);
int parse_gateway_net_if_cfg(const cJSON *data_json, gw_net_if_cfg_t *net_if_cfg);
int parse_gateway_wifi_cfg(const cJSON *data_json, gw_wifi_cfg_t *wifi_cfg);
int parse_gateway_cat1_cfg(const cJSON *data_json, gw_cat1_cfg_t *cat1_cfg);
int parse_gateway_bt_cfg(const cJSON *data_json, gw_bt_cfg_t *bt_cfg);
int parse_gateway_mqtt_server_cfg(const cJSON *data_json, gw_mqtt_server_cfg_t *mqtt_cfg);
int parse_gateway_data_cfg(const cJSON *data_json, gw_data_cfg_t *data_cfg);
int parse_gateway_wtd_cfg(const cJSON *data_json, gw_wtd_cfg_t *wtd_cfg);
int parse_gateway_ftp_log_cfg(const cJSON *data_json, gw_ftp_log_cfg_t *log_cfg);
int parse_gateway_log_switch_cfg(const cJSON *data_json, gw_log_switch_cfg_t *log_switch_cfg);
int parse_gateway_uart_485_cfg(const cJSON *data_json, gw_uart_485_cfg_t *uart_485_cfg);
int parse_gateway_timed_cfg(const cJSON *data_json, gw_timed_cfg_t *timed_cfg);
int parse_gateway_cfg(const cJSON *data_json, gateway_cfg_t *gw_cfg);

int parse_wiota_sys_cfg(const cJSON *data_json, wiota_sys_cfg_t *sys_cfg);
int parse_wiota_act_cfg(const cJSON *data_json, wiota_act_cfg_t *act_cfg);
int parse_wiota_freq_cfg(const cJSON *data_json, wiota_freq_cfg_t *freq_cfg);
int parse_wiota_power_cfg(const cJSON *data_json, wiota_power_cfg_t *power_cfg);
int parse_wiota_rate_cfg(const cJSON *data_json, wiota_rate_cfg_t *rate_cfg);
int parse_wiota_paging_tx_cfg(const cJSON *data_json, wiota_paging_tx_cfg_t *paging_tx_cfg);
int parse_wiota_sync_paging_cfg(const cJSON *data_json, wiota_sync_paging_cfg_t *sync_paging_cfg);
int parse_wiota_ts_cfg(const cJSON *data_json, wiota_ts_cfg_t *ts_cfg);
int parse_wiota_subf_mode_cfg(const cJSON *data_json, wiota_subf_mode_cfg_t *subf_cfg);
int parse_wiota_cfg(const cJSON *data_json, wiota_cfg_t *wiota_cfg);

int parse_sync_cfg(const cJSON *data_json, sync_cfg_t *sync_cfg);

int parse_slot_send_cfg(const cJSON *data_json, slot_send_cfg_t *slot_send_cfg);
//} parse end

//{add begin
int add_gateway_base_cfg(cJSON *data_json, const gw_base_cfg_t *base_cfg);
int add_gateway_auth_cfg(cJSON *data_json, const gw_auth_cfg_t *auth_cfg);
int add_gateway_id_mng_cfg(cJSON *data_json, const gw_id_manager_cfg_t *id_mng_cfg);
int add_gateway_net_policy_cfg(cJSON *data_json, const gw_net_policy_cfg_t *net_policy_cfg);
int add_gateway_net_if_cfg(cJSON *data_json, const gw_net_if_cfg_t *net_if_cfg);
int add_gateway_wifi_cfg(cJSON *data_json, const gw_wifi_cfg_t *wifi_cfg);
int add_gateway_cat1_cfg(cJSON *data_json, const gw_cat1_cfg_t *cat1_cfg);
int add_gateway_bt_cfg(cJSON *data_json, const gw_bt_cfg_t *bt_cfg);
int add_gateway_mqtt_server_cfg(cJSON *data_json, const gw_mqtt_server_cfg_t *mqtt_cfg);
int add_gateway_data_cfg(cJSON *data_json, const gw_data_cfg_t *data_cfg);
int add_gateway_wtd_cfg(cJSON *data_json, const gw_wtd_cfg_t *wtd_cfg);
int add_gateway_ftp_log_cfg(cJSON *data_json, const gw_ftp_log_cfg_t *log_cfg);
int add_gateway_log_switch_cfg(cJSON *data_json, const gw_log_switch_cfg_t *log_switch_cfg);
int add_gateway_uart_485_cfg(cJSON *data_json, const gw_uart_485_cfg_t *uart_485_cfg);
int add_gateway_timed_cfg(cJSON *data_json, const gw_timed_cfg_t *timed_cfg);
int add_gateway_cfg(cJSON *data_json, const gateway_cfg_t *gw_cfg);

int add_wiota_version(cJSON *data_json, const wiota_version_t *wiota_version);
int add_wiota_sys_cfg(cJSON *data_json, const wiota_sys_cfg_t *sys_cfg);
int add_wiota_act_cfg(cJSON *data_json, const wiota_act_cfg_t *act_cfg);
int add_wiota_freq_cfg(cJSON *data_json, const wiota_freq_cfg_t *freq_cfg);
int add_wiota_power_cfg(cJSON *data_json, const wiota_power_cfg_t *power_cfg);
int add_wiota_rate_cfg(cJSON *data_json, const wiota_rate_cfg_t *rate_cfg);
int add_wiota_paging_tx_cfg(cJSON *data_json, const wiota_paging_tx_cfg_t *paging_tx_cfg);
int add_wiota_sync_paging_cfg(cJSON *data_json, const wiota_sync_paging_cfg_t *sync_paging_cfg);
int add_wiota_ts_cfg(cJSON *data_json, const wiota_ts_cfg_t *ts_cfg);
int add_wiota_subf_mode_cfg(cJSON *data_json, const wiota_subf_mode_cfg_t *subf_cfg);
int add_wiota_cfg(cJSON *data_json, const wiota_cfg_t *wiota_cfg);

int add_sync_cfg(cJSON *data_json, const sync_cfg_t *sync_cfg);

int add_slot_send_cfg(cJSON *data_json, const slot_send_cfg_t *slot_send_cfg);
//} add end
int uc_read_static_data(static_data_t *static_data);
int uc_write_static_data(const static_data_t *static_data);

#endif // __CONFIG_DATA_H__